﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tibet.Datos.Interfaces;
using Tibet.Datos;
using System.Data.SqlClient;
using Tibet.Entidades;
using Tibet.Datos.FabricaDatos;


namespace Tibet.Datos.DaosSqlServer
{
    class DaoSqlServerAccesoReporte: IDaoAccesoReporte
    {
        public Tibet.Datos.Conexion InstanciarConexion()
        {
            Conexion nueva = new Conexion();
            return (nueva);
        }
        # region
        ////public bool InsertarReporte(Reporte reporte)
        ////{
        ////    Conexion bd = InstanciarConexion();
        ////    SqlCommand command = new SqlCommand();

        ////    try
        ////    {
        ////        bd.AbrirConexionBd();

        ////        command.Connection = bd.ObjetoConexion();
        ////        command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
        ////        command.CommandText = "[dbo].[INSReporte]"; // Nombre del Procedimiento Almacenado en la Base de Datos
        ////        command.CommandTimeout = 10;

        ////        command.Parameters.AddWithValue("@FK_Proyecto", reporte.IdProyecto);
        ////        command.Parameters.AddWithValue("@FK_Metrica", reporte.IdMetrica);
        ////        command.Parameters.AddWithValue("@Fecha_Ejecucion", System.DateTime.Today);
        ////        command.Parameters.AddWithValue("@Resultado", reporte.Resultado);
        ////        SqlDataReader reader = command.ExecuteReader();

        ////        reader.Close();
        ////        bd.CerrarConexionBd();
        ////        return true;

        ////    }

        ////    catch (SqlException)
        ////    {
        ////        bd.CerrarConexionBd();
        ////        return false;
        ////    }

        ////    catch (Exception)
        ////    {
        ////        bd.CerrarConexionBd();
        ////        return false;
        ////    }
        ////}
        # endregion

        //Conexion bd = new Conexion();
        IDaoAccesoConexion bd = FabricaConexion.DaoSqlServerAccesoConexion();
        /// <summary>
        /// Metodo ConsultarProyectos encargado de cargar en la 
        /// interfaz los diferentes proyecto existentes en la BD
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Usuarios</returns>
        public List<Proyecto> ConsultarProyectos()
        {
            //Boolean respuestaQuery = false;
            List<Proyecto> listaProyectos = new List<Proyecto>();
            //Tibet.Datos.Entidades.Proyecto proy = new Tibet.Datos.Entidades.Proyecto();
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosProyectos]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;


                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Proyecto proy = new Proyecto();
                    proy.Id = reader.GetInt32(0);
                    proy.Nombre = reader.GetString(1);
                    listaProyectos.Add(proy);
                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }


        }

        /// <summary>
        /// Metodo ConsultarProyectosCulminados se encargado de 
        /// cargar en la interfaz los 
        /// diferentes proyecto existentes en la BD
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Usuarios</returns>
        public List<Proyecto> ConsultarTodosProyectosCulminados()
        {
            //Boolean respuestaQuery = false;
            List<Proyecto> listaProyectos = new List<Proyecto>();
            //Tibet.Datos.Entidades.Proyecto proy = new Tibet.Datos.Entidades.Proyecto();
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosProyectosCulminados]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;


                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    Proyecto proy = new Proyecto();
                    proy.Id = reader.GetInt32(0);
                    proy.Nombre = reader.GetString(1);
                    listaProyectos.Add(proy);
                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            finally
            {
                bd.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo ConsultarProyectosCulminados se encargado de 
        /// cargar en la interfaz los 
        /// diferentes proyecto existentes en la BD
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Usuarios</returns>
        public List<ErrorP> ConsultarProyectosCulminados()
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();
            //Tibet.Datos.Entidades.Proyecto proy = new Tibet.Datos.Entidades.Proyecto();
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELProyectoCulminado]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;


                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    ErrorP error = new ErrorP();
                    error.NProyecto = reader["Proyecto"].ToString();
                    error.FechaI = reader.GetDateTime(1);
                    error.Mes = reader["Estatus"].ToString();
                    error.Cliente = reader["Cliente"].ToString();
                    error.Lider = reader["Lider"].ToString();
                    listaProyectos.Add(error);
                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            finally
            {
                bd.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo ConsultarMetricas  
        /// 
        /// </summary>
        /// <list type="ErrorP"></list>
        /// <returns>Lista de errores</returns>
        public List<ErrorP> ConsultarMetricas(int idProy, string metrica, int mesSelec)
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();

            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELConsultaMetricasProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;

                command.Parameters.AddWithValue("@idProy", idProy);
                command.Parameters.AddWithValue("@name", metrica);
                command.Parameters.AddWithValue("@anio", mesSelec);

                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    ErrorP error = new ErrorP();
                    error.Mes = reader.GetString(1);
                    error.Cant = reader.GetInt32(0);
                    error.Porcentaje = reader.GetInt32(2);
                    listaProyectos.Add(error);
                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                //bd.CerrarConexionBd();
                return null;
            }

            finally
            {
                bd.CerrarConexionBd();
            }
        }

        /// <summary>
        /// Metodo ConsultarProyectosEnCurso se encargado de 
        /// cargar en la interfaz los 
        /// diferentes proyecto que se encuentran en curso
        /// hasta la fecha existentes en la BD
        /// </summary>
        /// <list type="Proyecto"></list>
        /// <returns>Lista de Usuarios</returns>
        public List<ErrorP> ConsultarProyectosEnCurso()
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();
            //Tibet.Datos.Entidades.Proyecto proy = new Tibet.Datos.Entidades.Proyecto();
            SqlCommand command = new SqlCommand();

            try
            {

                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELProyectoActivo]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;


                SqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    ErrorP error = new ErrorP();
                    error.NProyecto = reader["Proyecto"].ToString();
                    error.FechaI = reader.GetDateTime(1);
                    error.Mes = reader["Estatus"].ToString();
                    error.Cliente = reader["Cliente"].ToString();
                    error.Lider = reader["Lider"].ToString();
                    listaProyectos.Add(error);

                }
                reader.Close();
                bd.CerrarConexionBd();

                return listaProyectos;

            }

            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
        }

        /// <summary>
        /// Metodo ConsultarErroresPorProyectoss se encarga de 
        /// cargar en la interfaz los diferentes errores de un 
        /// proyecto en especifico y su 
        /// cantidad de erroresexistentes en la BD
        /// </summary>
        /// <param name="idProy"></param>
        /// <list type="ErrorP"></list>
        /// <returns>List<ErrorP></returns>
        public List<ErrorP> ConsultarErroresPorProyecto(int idProy, int anio)
        {
            //Boolean respuestaQuery = false;
            List<ErrorP> listaProyectos = new List<ErrorP>();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELConsultaLog]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idProy", idProy);
                command.Parameters.AddWithValue("@anio", anio);
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    ErrorP error = new ErrorP();
                    error.Cant = reader.GetInt32(0);
                    error.Porcentaje = reader.GetInt32(1);
                    error.Mes = reader.GetString(2);
                    listaProyectos.Add(error);

                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaProyectos;
            }
            # region catch
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
            # endregion catch
        }
        public List<Proyecto> ConsultarProyectosCliente(int idCliente)
        {
            List<Proyecto> listaproyecto = new List<Proyecto>();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELProyectoPorCliente]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idCliente", idCliente);
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Proyecto proy = new Proyecto();
                    proy.Nombre = reader.GetString(0);
                    proy.Estatus = reader.GetString(2);
                    proy.IdCliente = reader.GetInt32(3);
                    listaproyecto.Add(proy);
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listaproyecto;
            }
            # region catch
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
            # endregion catch
        }
        /// <summary>
        /// Metodo ConsultarDesarrolladorProyecto se encarga buscar los desarrolladores en un proyecto 
        /// para llenar el reporte
        /// </summary>
        /// <param name="idProyecto"></param>
        /// <returns></returns>
        public List<Usuario> ConsultarDesarrolladorProyecto(int idProyecto)
        {
            List<Usuario> listausuario = new List<Usuario>();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosDesarrolladoresProyecto]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                command.Parameters.AddWithValue("@idProyecto", idProyecto);
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Usuario user = new Usuario();
                    user.Nombre = reader.GetString(1);
                    //user.Id = reader.GetInt32(0);
                    user.IdUsuario = reader.GetInt32(0);
                    listausuario.Add(user);
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listausuario;
            }
            # region catch
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
            # endregion catch
        }

        public List<Cliente> ConsultarTodosClientes() 
        {
            List<Cliente> listacliente = new List<Cliente>();
            SqlCommand command = new SqlCommand();
            try
            {
                bd.AbrirConexionBd();
                command.Connection = bd.ObjetoConexion();
                command.CommandType = System.Data.CommandType.StoredProcedure; //Tipo de comando que se va a ejecutar
                command.CommandText = "[dbo].[SELTodosClientes]"; // Nombre del Procedimiento Almacenado en la Base de Datos
                command.CommandTimeout = 10;
                SqlDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Cliente client = new Cliente();
                    client.Nombre = reader.GetString(1);
                    listacliente.Add(client);
                }
                reader.Close();
                bd.CerrarConexionBd();
                return listacliente;
            }

            # region catch
            catch (SqlException)
            {
                bd.CerrarConexionBd();
                return null;
            }

            catch (Exception)
            {
                bd.CerrarConexionBd();
                return null;
            }
            # endregion catch
        }
    }
}
